package net.kehuilai.tools;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * Created by andy,genghz on 16/12/22.
 */
public final class MathTool {

    // 高精度加法
    public static BigDecimal add(double a, double b) {
        BigDecimal bA = new BigDecimal(String.valueOf(a));
        BigDecimal bB = new BigDecimal(String.valueOf(b));
        return bA.add(bB);
    }

    // 高精度减法
    public static BigDecimal subtract(double a, double b) {
        BigDecimal bA = new BigDecimal(String.valueOf(a));
        BigDecimal bB = new BigDecimal(String.valueOf(b));
        return bA.subtract(bB);
    }

    // 高精度乘法
    public static BigDecimal multiply(double a, double b) {
        BigDecimal bA = new BigDecimal(String.valueOf(a));
        BigDecimal bB = new BigDecimal(String.valueOf(b));
        return bA.multiply(bB);
    }

    // 高精度除法 (四舍五入 保留2位小数)
    public static BigDecimal divide(double a, double b) {
        return divide(a, b, 2);
    }

    // 高精度除法 (四舍五入 保留指定位数位小数)
    public static BigDecimal divide(double a, double b, int wei) {
        return divide(a, b, wei, RoundingMode.HALF_UP);
    }

    // 高精度除法 (指定机保留方式、位数 小数)
    public static BigDecimal divide(double a, double b, int wei, RoundingMode roundingMode) {
        BigDecimal bA = new BigDecimal(String.valueOf(a));
        BigDecimal bB = new BigDecimal(String.valueOf(b));
        return bA.divide(bB, 2, roundingMode);
    }

    // 高精度加法
    public static BigDecimal add(String a, String b) {
        BigDecimal bA = new BigDecimal(a);
        BigDecimal bB = new BigDecimal(b);
        return bA.add(bB);
    }

    // 高精度减法
    public static BigDecimal subtract(String a, String b) {
        BigDecimal bA = new BigDecimal(a);
        BigDecimal bB = new BigDecimal(b);
        return bA.subtract(bB);
    }

    // 高精度乘法
    public static BigDecimal multiply(String a, String b) {
        BigDecimal bA = new BigDecimal(a);
        BigDecimal bB = new BigDecimal(b);
        return bA.multiply(bB);
    }

    // 高精度除法 (保留2位小数)
    public static BigDecimal divide(String a, String b) {
        BigDecimal bA = new BigDecimal(a);
        BigDecimal bB = new BigDecimal(b);
        return bA.divide(bB, 2, RoundingMode.HALF_UP);
    }

    // 向下取整保留指定位小数
    public static BigDecimal roundDown(double orig, int wei) {
        BigDecimal decimal = new BigDecimal(orig);
        return decimal.setScale(wei, BigDecimal.ROUND_DOWN);
    }

    // 向下取整保留指定位小数
    public static BigDecimal roundUp(double orig, int wei) {
        BigDecimal decimal = new BigDecimal(orig);
        return decimal.setScale(wei, BigDecimal.ROUND_UP);
    }

    // 四舍五入取整保留指定位小数
    public static BigDecimal roundHalfUp(double orig, int wei) {
        BigDecimal decimal = new BigDecimal(orig);
        return decimal.setScale(wei, BigDecimal.ROUND_HALF_UP);
    }
}
